package cc.rengu.oltp.utility.util;

import java.io.Serializable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 正则表达款校验
 * Created by wangcheng on 2021/10/18 11:40
 */
public class RegexUtil implements Serializable {
    /**
     * 检查 email输入是否正确
     * 正确的书写格 式为 username@domain
     *
     * @param value  email字符串
     * @param length email最大长度
     * @return true-正确，false-不正确
     */
    public static boolean checkEmail(String value, int length) {
        return value.matches("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*") && value.length() <= length;
    }

    /**
     * 检查固定电话输入 是否正确
     * 正确格 式 012-87654321、0123-87654321、0123－7654321
     *
     * @param value 固定电话号码字符串
     * @return true-正确，false-不正确
     */
    public static boolean checkTel(String value) {
        return value.matches("\\d{4}-\\d{8}|\\d{4}-\\d{7}|\\d(3)-\\d(8)");
    }

    /**
     * 检查手机输入 是否正确
     *
     * @param value 手机号
     * @return true-正确，false-不正确
     */
    public static boolean checkPhoneNo(String value) {
        Pattern pattern = Pattern.compile("^1[0-9]{10}$");
        Matcher matcher = pattern.matcher(value);
        return matcher.matches();
    }

    /**
     * 检查中文名输 入是否正确
     *
     * @param value  中文姓名
     * @param length 姓名最大长度
     * @return true-正确，false-不正确
     */
    public static boolean checkChineseName(String value, int length) {
        return value.matches("^[\u4e00-\u9fa5]+$") && value.length() <= length;
    }

    /**
     * 检查HTML 中首尾空行或空格
     *
     * @param value htmp字符串
     * @return true-正确，false-不正确
     */
    public static boolean checkBlank(String value) {
        return value.matches("^\\s*|\\s*$");
    }

    /**
     * 检查字符串是 否含有HTML标签
     *
     * @param value Html标签
     * @return true-正确，false-不正确
     */

    public static boolean checkHtmlTag(String value) {
        return value.matches("<(\\S*?)[^>]*>.*?</\\1>|<.*? />");
    }

    /**
     * 检查URL是 否合法
     *
     * @param value URL字符串
     * @return true-正确，false-不正确
     */
    public static boolean checkURL(String value) {
        return value.matches("[a-zA-z]+://[^\\s]*");
    }

    /**
     * 检查IP是否 合法
     *
     * @param value IP地址
     * @return true-正确，false-不正确
     */
    public static boolean checkIP(String value) {
        return value.matches("\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}");
    }

    /**
     * 检查字符串是否 合法，开头必须是大小写字母，其他位可以有大小写字符、数字、下划线
     *
     * @param value 字符开头的字符串
     * @return true-正确，false-不正确
     */
    public static boolean checkAscStr(String value) {
        return value.matches("[a-zA-Z][a-zA-Z0-9_]{4,15}$");
    }

    /**
     * 检查邮编是否 合法
     *
     * @param value 邮编
     * @return true-正确，false-不正确
     */
    public static boolean checkPostCode(String value) {
        return value.matches("[1-9]\\d{5}(?!\\d)");
    }

    /**
     * 检查身份证是 否合法,15位或18位
     *
     * @param value 身份证号
     * @return true-正确，false-不正确
     */
    public static boolean checkCertNo(String value) {
        String regularExpression = "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx])|" + "([1−9]\\d5\\d2((0[1−9])|(10|11|12))(([0−2][1−9])|10|20|30|31)\\d3)";
        Pattern pattern = Pattern.compile(regularExpression);
        Matcher matcher = pattern.matcher(value);
        boolean matches = matcher.matches();
        //判断第18位校验值
        if (matches) {
            if (value.length() == 18) {
                try {
                    char[] charArray = value.toCharArray();
                    //前十七位加权因子
                    int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
                    //这是除以11后，可能产生的11位余数对应的验证码
                    String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
                    int sum = 0;
                    for (int i = 0; i < idCardWi.length; i++) {
                        int current = Integer.parseInt(String.valueOf(charArray[i]));
                        int count = current * idCardWi[i];
                        sum += count;
                    }
                    char idCardLast = charArray[17];
                    int idCardMod = sum % 11;
                    return idCardY[idCardMod].equalsIgnoreCase(String.valueOf(idCardLast));
                } catch (Exception e) {

                    return false;
                }
            }
        }
        return matches;
    }

    /**
     * 检查是否满足银行卡规则 纯数字指[0~9]且长度不大于19位
     *
     * @param value 字符串
     * @return true-正确，false-不正确
     */
    public static boolean checkCardNo(String value) {
        Pattern pattern = Pattern.compile("[0-9]*");
        Matcher matcher = pattern.matcher(value);
        if (value.length() > 19) {
            return false;
        }
        return matcher.matches();
    }

    /**
     * 检查输入是否 满足两位小数点金额
     *
     * @param value 金额串
     * @return true-正确，false-不正确
     */
    public static boolean checkAmt(String value) {
        Pattern pattern = Pattern.compile("^(([1-9]{1}\\d*)|([0]{1}))(\\.(\\d){0,2})?$");
        Matcher match = pattern.matcher(value);
        return match.matches();
    }

    /**
     * 检查输入是否 超出规定长度
     *
     * @param length 最大长度
     * @param value  字符串
     * @return true-正确，false-不正确
     */
    public static boolean checkLength(String value, int length) {
        return ((value == null || "".equals(value.trim())) ? 0 : value.length()) <= length;
    }
}
